package com.zbkj.common.utils;

/**
 * @ClassName: GeoDistanceCalculator
 * @Description: TODO
 * @Author: fanbing
 * @Date: 2024/9/11 22:11
 * @Version: V1.0
 **/
public class GeoDistanceCalculator {

    /**
     * 地球平均半径，单位为千米
     */
    private static final double EARTH_RADIUS = 6371.0;

    /**
     * 根据经纬度计算两点间距离.
     *
     * @param lat1 第一点纬度
     * @param lon1 第一点经度
     * @param lat2 第二点纬度
     * @param lon2 第二点经度
     * @return 距离（米）
     */
    public static double distance(double lat1, double lon1, double lat2, double lon2) {
        // 将角度转换为弧度
        lat1 = Math.toRadians(lat1);
        lon1 = Math.toRadians(lon1);
        lat2 = Math.toRadians(lat2);
        lon2 = Math.toRadians(lon2);

        // 哈弗辛斯公式
        double dlon = lon2 - lon1;
        double dlat = lat2 - lat1;
        double a = Math.pow(Math.sin(dlat / 2), 2)
                + Math.cos(lat1) * Math.cos(lat2)
                * Math.pow(Math.sin(dlon / 2), 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        // 计算距离并转换为米
        return EARTH_RADIUS * c * 1000;
    }
}